{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-11-21T07:43:56.729362Z",
     "start_time": "2025-11-21T07:43:56.716246Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import operator\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "import time\n",
    "import torchvision.datasets as dsets\n",
    "from torch.utils.data import DataLoader\n",
    "import random\n",
    "\n",
    "# Custom KNN implementation\n",
    "def kNN_classify(k, dis, X_train, y_train, X_test):\n",
    "    \"\"\"\n",
    "    Custom KNN classifier\n",
    "\n",
    "    Parameters:\n",
    "    - k: K value, number of nearest neighbors to select\n",
    "    - dis: Distance metric, 'E' for Euclidean, 'M' for Manhattan\n",
    "    - X_train: Training feature data\n",
    "    - y_train: Training labels\n",
    "    - X_test: Test feature data\n",
    "\n",
    "    Returns:\n",
    "    - Predicted label array\n",
    "    \"\"\"\n",
    "    assert dis == 'E' or dis == 'M', 'dis must be E or M, E for Euclidean distance, M for Manhattan distance'\n",
    "    # Number of test samples\n",
    "    num_test = X_test.shape[0]\n",
    "    label_list = []\n",
    "\n",
    "    '''Use Manhattan distance as the distance metric'''\n",
    "    if dis == 'M':\n",
    "        for i in range(num_test):\n",
    "            # Implement Manhattan distance formula\n",
    "            tmp1 = np.sum(np.absolute((X_train - np.tile(X_test[i], (X_train.shape[0], 1)))), axis=1)\n",
    "            distances = np.sqrt(tmp1)\n",
    "            # Sort distances from small to large and return index values\n",
    "            nearest_k = np.argsort(distances)\n",
    "            top_k = nearest_k[:k]  # Select top k distances\n",
    "            class_count = {}\n",
    "            for j in top_k:  # Count the number of each class\n",
    "                class_count[y_train[j]] = class_count.get(y_train[j], 0) + 1\n",
    "            sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)\n",
    "            label_list.append(sorted_class_count[0][0])\n",
    "        return np.array(label_list)\n",
    "\n",
    "    '''Use Euclidean distance as the distance metric'''\n",
    "    if dis == 'E':\n",
    "        for i in range(num_test):\n",
    "            # Implement Euclidean distance formula\n",
    "            distances = np.sqrt(np.sum(((X_train - np.tile(X_test[i], (X_train.shape[0], 1))) ** 2), axis=1))\n",
    "            # Sort distances from small to large and return index values\n",
    "            nearest_k = np.argsort(distances)\n",
    "            top_k = nearest_k[:k]  # Select top k distances\n",
    "            class_count = {}\n",
    "            for j in top_k:  # Count the number of each class\n",
    "                class_count[y_train[j]] = class_count.get(y_train[j], 0) + 1\n",
    "            sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)\n",
    "            label_list.append(sorted_class_count[0][0])\n",
    "        return np.array(label_list)\n",
    "\n",
    "# Visualize KNN prediction results\n",
    "def visualize_knn_predictions(X_test, y_test, y_test_pred_custom, y_test_pred_sklearn, num_images=10):\n",
    "    \"\"\"\n",
    "    Visualize prediction results of two KNN algorithms\n",
    "    \"\"\"\n",
    "    # Reshape flattened images back to 28x28\n",
    "    images = X_test[:num_images].reshape(num_images, 28, 28)\n",
    "\n",
    "    # Create subplots\n",
    "    fig, axes = plt.subplots(2, 5, figsize=(15, 8))\n",
    "    axes = axes.ravel()\n",
    "\n",
    "    for i in range(num_images):\n",
    "        # Display image\n",
    "        axes[i].imshow(images[i], cmap='gray')\n",
    "\n",
    "        # Check if prediction is correct\n",
    "        custom_correct = y_test_pred_custom[i] == y_test[i]\n",
    "        sklearn_correct = y_test_pred_sklearn[i] == y_test[i]\n",
    "\n",
    "        # Set title to show true label and predictions from both algorithms\n",
    "        title = f'True: {y_test[i]}\\nCustom: {y_test_pred_custom[i]} ({\"Yes\" if custom_correct else \"No\"})\\nsklearn: {y_test_pred_sklearn[i]} ({\"Yes\" if sklearn_correct else \"No\"})'\n",
    "\n",
    "        # Green if both correct, red if both wrong, otherwise yellow\n",
    "        if custom_correct and sklearn_correct:\n",
    "            color = 'green'\n",
    "        elif not custom_correct and not sklearn_correct:\n",
    "            color = 'red'\n",
    "        else:\n",
    "            color = 'orange'\n",
    "\n",
    "        axes[i].set_title(title, color=color, fontsize=10)\n",
    "        axes[i].axis('off')\n",
    "\n",
    "    plt.suptitle('KNN MNIST Digit Recognition Results Comparison', fontsize=16)\n",
    "    plt.tight_layout()\n",
    "    plt.subplots_adjust(top=0.85)\n",
    "    plt.show()\n",
    "\n",
    "# Load MNIST dataset\n",
    "def load_mnist_data(train_sample_size=1000, test_sample_size=200):\n",
    "    \"\"\"\n",
    "    Load MNIST dataset and perform preprocessing\n",
    "    \"\"\"\n",
    "    # Set random seed\n",
    "    random_seed = np.random.randint(0, 10000)\n",
    "    np.random.seed(random_seed)\n",
    "    random.seed(random_seed)\n",
    "    print(f\"Random seed set to: {random_seed}\")\n",
    "\n",
    "    # Load dataset\n",
    "    print(\"Loading MNIST dataset...\")\n",
    "    mnist_train_dataset = dsets.MNIST(root=\"dataset/mnist\", train=True, download=True)\n",
    "    mnist_test_dataset = dsets.MNIST(root=\"dataset/mnist\", train=False, download=True)\n",
    "\n",
    "    # Prepare training data (random selection)\n",
    "    print(f\"Preparing training data (randomly selecting {train_sample_size} samples)...\")\n",
    "    train_indices = np.random.choice(len(mnist_train_dataset), train_sample_size, replace=False)\n",
    "    X_train = mnist_train_dataset.data[train_indices].numpy()\n",
    "    X_train = X_train.reshape(X_train.shape[0], 28 * 28)  # Flatten images\n",
    "    y_train = mnist_train_dataset.targets[train_indices].numpy()\n",
    "\n",
    "    # Prepare test data (random selection)\n",
    "    print(f\"Preparing test data (randomly selecting {test_sample_size} samples)...\")\n",
    "    test_indices = np.random.choice(len(mnist_test_dataset), test_sample_size, replace=False)\n",
    "    X_test = mnist_test_dataset.data[test_indices].numpy()\n",
    "    X_test = X_test.reshape(X_test.shape[0], 28 * 28)  # Flatten images\n",
    "    y_test = mnist_test_dataset.targets[test_indices].numpy()\n",
    "\n",
    "    return X_train, y_train, X_test, y_test\n"
   ],
   "outputs": [],
   "execution_count": 57
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:43:58.767920Z",
     "start_time": "2025-11-21T07:43:56.736505Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\"\"\"\n",
    "Compare performance of custom KNN and sklearn KNN on MNIST dataset\n",
    "\"\"\"\n",
    "# Load data\n",
    "X_train, y_train, X_test, y_test = load_mnist_data(train_sample_size=1000, test_sample_size=200)\n",
    "\n",
    "# Test different k values\n",
    "k_values = [1, 3, 5, 7, 9]\n",
    "results = []\n",
    "\n",
    "print(\"\\nComparing performance with different k values:\")\n",
    "print(\"k   | Custom KNN Accuracy | sklearn KNN Accuracy | Custom KNN Time(s) | sklearn KNN Time(s)\")\n",
    "print(\"-\" * 90)\n",
    "\n",
    "for k in k_values:\n",
    "    # Test custom KNN\n",
    "    start_time = time.time()\n",
    "    custom_pred = kNN_classify(k, 'E', X_train, y_train, X_test)\n",
    "    custom_time = time.time() - start_time\n",
    "    custom_accuracy = np.sum(custom_pred == y_test) / len(y_test)\n",
    "\n",
    "    # Test sklearn KNN\n",
    "    start_time = time.time()\n",
    "    sklearn_knn = KNeighborsClassifier(n_neighbors=k, algorithm='auto', n_jobs=-1)\n",
    "    sklearn_knn.fit(X_train, y_train)\n",
    "    sklearn_pred = sklearn_knn.predict(X_test)\n",
    "    sklearn_time = time.time() - start_time\n",
    "    sklearn_accuracy = np.sum(sklearn_pred == y_test) / len(y_test)\n",
    "\n",
    "    # Record results\n",
    "    results.append((k, custom_accuracy, sklearn_accuracy, custom_time, sklearn_time))\n",
    "\n",
    "    print(f\"{k:3d} | {custom_accuracy*100:18.2f}% | {sklearn_accuracy*100:17.2f}% | {custom_time:19.6f} | {sklearn_time:18.6f}\")\n",
    "\n"
   ],
   "id": "16d40c0e8c97fd1c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Random seed set to: 79\n",
      "Loading MNIST dataset...\n",
      "Preparing training data (randomly selecting 1000 samples)...\n",
      "Preparing test data (randomly selecting 200 samples)...\n",
      "\n",
      "Comparing performance with different k values:\n",
      "k   | Custom KNN Accuracy | sklearn KNN Accuracy | Custom KNN Time(s) | sklearn KNN Time(s)\n",
      "------------------------------------------------------------------------------------------\n",
      "  1 |              23.00% |             90.00% |            0.358146 |           0.035634\n",
      "  3 |              20.50% |             88.00% |            0.380688 |           0.023121\n",
      "  5 |              20.50% |             90.00% |            0.371799 |           0.035648\n",
      "  7 |              18.00% |             90.00% |            0.366651 |           0.022923\n",
      "  9 |              16.00% |             88.00% |            0.362066 |           0.022822\n"
     ]
    }
   ],
   "execution_count": 58
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:43:59.108380Z",
     "start_time": "2025-11-21T07:43:58.775473Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Use best k value (highest accuracy) for visualization\n",
    "best_result = max(results, key=lambda x: max(x[1], x[2]))\n",
    "best_k = best_result[0]\n",
    "print(f\"\\nUsing best k value {best_k} for visualization comparison...\")\n",
    "\n",
    "# Re-run predictions with best k value\n",
    "custom_pred = kNN_classify(best_k, 'E', X_train, y_train, X_test)\n",
    "sklearn_knn = KNeighborsClassifier(n_neighbors=best_k)\n",
    "sklearn_knn.fit(X_train, y_train)\n",
    "sklearn_pred = sklearn_knn.predict(X_test)\n",
    "\n"
   ],
   "id": "854c4d507a69e392",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Using best k value 1 for visualization comparison...\n"
     ]
    }
   ],
   "execution_count": 59
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:44:00.343957Z",
     "start_time": "2025-11-21T07:43:59.116896Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Visualize results\n",
    "visualize_knn_predictions(X_test, y_test, custom_pred, sklearn_pred)\n",
    "\n",
    "# Plot performance comparison\n",
    "plt.figure(figsize=(12, 5))\n",
    "\n"
   ],
   "id": "f0ab77b23a29b386",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1500x800 with 10 Axes>"
      ],
      "image/png": "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AACgxpC6OwEAAID+bfDgwUVxhx56aFHcN77xjaK47bffviju3HPPLYoDgN5kRDoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANRoa29vby8KbGsrCQPoscJ0NElyFDC1yVFAXyZHUWfEiBFFG+ill15q6oa88cYbi+LWXnvtpj4vfY8cBQyEHGVEOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1BhSdycAAADQv+2666698rw///nPe+V5gf7l4osvLorbdNNNoze0tbUVxZ1zzjlFcddcc00MFG+88UZR3NFHHx0DgRHpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQo629vb29KLCtrSQMoMcK09EkyVHA1CZH9Q8LLbRQUdwNN9xQFDf33HM39d+h66+/vihu//33L4q75JJLiuIY+OQo6nzve98r2kA//vGPi+Luu+++orjllluuKI6BT46izrBhw4o20IMPPlgUN++88/bpDX7bbbcVxS2//PJFcUOHDo3e8vzzzw+I96Q0RxmRDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANYbU3UnftvDCCxfFbbTRRkVx22yzTVHcjjvuWBTX3t5eFNfW1lYUd8oppxTFPfroo0Vxxx9/fFHcY489VhQ3evToojhoFQcddFBR3Ac/+MGiuPPPP78o7uabb45muuKKK4ri5ACYuhZddNGiuBtvvLEobrbZZmvq/kxp3JprrlkUd/rppxfFrbvuukVx9913X1Ec0L985CMfKYrbd999m/q8P/7xj5u6PKC1vfnmm0Vx48aNK4q78sori+KOPPLIorgHHnggmunFF18sittyyy2bun6zzjprNLvm+Oqrr0YrMSIdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqtLW3t7cXBba1lYRRY9NNNy3aPgsuuGBR3OGHH14UN2LEiF55X+67776iuAceeKCpzzts2LCiuA9+8INFcccdd1xR3Fe+8pWiuHHjxhXFtaLCdDRJctS085Of/KSp34mHHnqoKG6ppZYqihs+fHhTPzPPPfdcUdydd95ZFHfWWWcVxZ166qlFcS+//HJRHFNOjmq+oUOHFsf+/e9/b+r+1kDxzDPPFMV98pOfLIq78sorp3CN6C1y1MAywwwzFMX961//Kopbd911m7o/s/766xfFvfbaa0VxDHxyFHUWXnjhog0033zzFcXdddddRXGjRo0qimPgay+sRxmRDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACgRlt7e3t7UWBbW7SSOeecsyjuwAMPLF7m7rvvXhQ3ePDgorjCty6uvfbaorhzzz23KO6MM84oihs5cmRT40oNGTKkKO7ggw8uivv2t79dFDfzzDMXxY0ZM6YorhWVfqYnpdVyVG+66KKLiuLOP//8orhf/epXRXFLL710UdwMM8xQFDfffPMVxX30ox8titt2222L4uaaa66iuOuvv74o7kMf+lBR3Ouvv14Ux3uTo5rvm9/8ZnHs4YcfPhXWoHVcddVVRXEf+chHiuJeeeWVKVwjmk2OGlgWXXTRorhHHnmkqZ+P0mPW3/3ud0Vx0N3P4KQ41ut7FlpooaK4LbbYoihu9tlnL4r76U9/WhQHUytHGZEOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA1hkSLaWtrK4r78pe/3NS41N7eXhR3+eWXF8UdcsghRXGXXnpptJJ33nmnKG6//fZrahwwodlnn72pm+T+++9v6vJuv/32oriLL764KO5rX/taUdzVV19dFLfgggsWxQ0Z0nL/lAM98L73va8o7phjjimK23nnnb0PMBWdcsopTT3GfP3114vi/vGPfxTFAf3LjDPO2NSa2b777lsUt9tuuxXF/f73vy+KGzFiRFHcyJEji+Kgu4xIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGkOixXz3u98tijvwwAOL4p5++uni595tt92K4i688MLiZQJMayeddFJR3Kc//eloJaNHjy6Ke+mll5oa98orrxTFAT0zbty4orgxY8YUxb3xxhtFcccdd1xR3I477lgUt9hiixXFrbvuukVxCy64YFHck08+WRQHrWLJJZcsiltxxRWL4tra2oriTjzxxKK4xx57rCgO6H177rlncew3v/nNoriZZpqpKO7RRx+NZlp++eWL4saOHdvU54XuMiIdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqDIkBYsiQspey2267FcW1t7cXxR199NFR6sILLyyOpe8YPnx4UdyYMWOaGgd91WqrrVYU97vf/S5aydJLL10Ut9FGGxXF7bLLLlO4RkCdZ599tmgD/etf/yqK+/73v18U9/TTTxfFvfXWW0Vx++67b1HcGWecURS3ww47FMUddNBBRXFf/OIXi+Kgv5thhhmamitmnHHGph63nn322UVxQP9RWt9KCy20UFOfe7bZZmvq8t55552iuA022KAo7qKLLprCNYJJMyIdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqDIkBYvPNNy+KW3jhhYvi7rrrrqK4n/3sZ0Vx9D0bbbRRUdzf/va3orhrrrmmKG6bbbYpioO+6lvf+la0kqFDhxbF7bfffkVx0003XVHcmWeeWRQH9My2225bFHfjjTc2dROvsMIKRXErrrhiU593lVVWaeryttpqq6K4GWaYoSjurbfemsI1gt614IILFsXtsssu0RvuvffeXnleYOq5+eabi2OXXXbZAVGfWXPNNYviRo4cWRT39NNPF8UdcsghRXFnn312URz9lxHpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQY0jdna1s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deeddxZtpfXXX78o7vDDDy+K+8Mf/hDN9OEPf7gobq211iqKm3766aO3XHfddb323DCl9t5776K4hx9+uCjuM5/5TFHcOuusE73h3nvvLYq7/PLLi+Ieeuihorjzzz+/qesHdf773/8WbaDDDjusKO6AAw5o+r/ve+yxR1P3e0ptuOGGRXG77757Udyqq64azfTOO+8Uxd1zzz1FcSeffPIUrhG9xYh0AAAAAACooZAOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA12trb29uLAtvaSsKg1y244IJFcY899lhTn3eGGWYoihszZkxTn3cgKUxHkyRHDXxHHHFEUdw3v/nNorgPf/jDRXGXXnppURwDnxxFnWWWWaapOWX++ee3wSfhd7/7XfF22WOPPab6d7svkaOAvkyOar7tt9++OHa//fYriltttdWilbzyyitFcb/+9a+L4r7//e9P4RrR13OUEekAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFCjrb29vb0osK2tJAx63YILLlgU99hjjzX1eWeYYYaiuDFjxjT1eQeSwnQ0SXJU/zVs2LCiuFtuuaUo7tVXXy2KW3vttYvioEGOohk++9nPFsX98Y9/bKkNfscddxTFffrTny5e5p133hmtRI4C+jI5qnfNP//8RXE777xzUdwOO+xQFLfOOutEbzjqqKOK4n75y1/2Sv2I/pujjEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaQ+ruBMptvfXWRXF/+9vfbFbo4lvf+lbR9lhqqaWK4n73u9/ZvkCfdeKJJxbFLb744kVx+++/f/Rlxx57bFHcaaedVhR35513TuEaAUDrefrpp4viDj/88KbGwUBjRDoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANQYUncn9EejRo0qijv77LOL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AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANYbU3Qk034477lgcu9RSSxXFHXLIIUVx48aNK35uAAAAAKBiRDoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANQYUncnUG6BBRYoijvhhBOKlzn99NM39S348Y9/3NTlAcBAt+yyyxbFLbrookVx3/ve94ri5pprrqK4u+++uyjuhRdeiGY66qijiuLuvffepj4vAAD0FiPSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACgxpC6O4GIoUOHFm2Gb3zjG0Vx008/fdM364gRI5q+TBjo5ptvvqK4L3zhC0Vxiy22WFHc5z//+Wimn/zkJ0VxP/3pT4viXn/99SlcI5g65pprrqK47bffvihu1113LYpbdtlli+KGDx9eFNfe3l4U19bWVhS39NJLN3V5pev3qU99qihurbXWKoq79957i+IAAPq7mWeeuShujTXWKIrbcssti+I+9KEPRbOPl3/wgx8UxR1zzDExEBiRDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANdra29vbiwLb2krCYMDZYostiuLOOeecorihQ4dGs6211lpFcTfeeGP0ZYXpaJLkKBr22muvoo2x5557FsXNN998fXrjln72f/GLXxTFfetb35rCNRq45KiIueaaq2hbrbHGGkVx3/ve94q3//ve976mvk+l353nn3++KO6kk04qirv33nujN5Ruvw033LAobpFFFimK++1vf1sUt8ceexTF8d7kqNa06667FsXNNNNM0ZetvPLKRXEbb7xxUdwJJ5xQFPf973+/KO6qq64qijvssMOi1Pnnnx+tRI5iWpp++umL4hZbbLGiuK233rqpy9t8882L4hZddNHoLffdd19R3GabbVYU98QTT8RAyFFGpAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqNHW3t7eXhTY1lYSBv3GXHPNVRR33nnnFcWtvfba0WynnXZaUdwnP/nJorjCr3uvmZL1k6P6r0GDys7p7r333kVxP/jBD4rihgwZUhT38ssvF8X95S9/KYqbbbbZiuI233zzpuayM844oyhup512KoprRXJUxIUXXli0rT784Q83fZuW5vm//vWvRXFnn312UdxVV11VFPf444/HQLDbbrsVxR1zzDFFcc8//3xR3LzzzlsUx3uTo5pvjjnmKI7dYYcdiuL233//pua8eeaZpyhu8ODB0RtKX0dfP04pfR1vvPFG8TI33njjoribb745BgI5imm5n1Iat9pqq0Ur5cZ99923OPaEE04oinvrrbeauu9Yevy9xx57RDOVbmsj0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoMaQujtpriWXXLIo7hOf+ERR3I9//OMpXKPWttVWWxXFrb766k193kceeaQ49oc//GFRXHt7+xSsEfSuvffeu1dy3t/+9reiuD322KMo7vnnn49muuOOO4ri5pprrqK4p556agrXiIGs9N+bD3/4w0VxTzzxRFHcb3/722j2d/bee+8tXiY919bW1tQcBX3RpptuWhx7zDHH9Mp3zHFA3zJs2LDi2KFDh07VdYG+YJ111imKO/roo4vi1lhjjWim0v3L2WefvShu4403jmZ64IEHiuIOO+ywpu6jpxNOOKEo7oMf/GA0U+lxa+lxerMZkQ4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADWG1N3J5A0ePLh4M51wwglFcWuuuWZR3Ouvv14Ud9RRR0UrWXDBBYvifvnLXxbFDRlS9jV58803i+IOOeSQKHXXXXcVx8K0MvvssxfF7bfffkVxX/3qV6OZtttuu6K48847L3rD2muvXRS3xBJLNPV5zz333KYuj/6h9Hu47777FsXdfffdRXHvf//7i+JeeOGFojj6nvb29qbGQV/0ta99rbdXgX7mjTfeKI4dPXr0VF0XmJrOP//8oriNNtqoKG7s2LFFcXvvvXdR3IknnlgUt8oqqxTFnX766U3d73nkkUeK4uabb76iuCOPPLIobqaZZopSo0aNKor74x//WBR31llnFcVdc8010ZcZkQ4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADWG1N3ZygYNKjvHsMceexQvc7311otmWmmllZq6vIFixRVXLIqbeeaZm/q8N910U1Hcn/70p6Y+LzTL7LPPXhR3+eWXF8WtsMIKRXGjRo0qilt99dWL4h566KHoDYssskhR3IknnlgUN/300xfFjRw5sijuqaeeKopjYNlwww2L4tra2orizj777KK4F154oSiO/qv0MwP0zBVXXFEUt8oqqxTFzTrrrH36rbj11luL4q688sqiuK9//evRG84///ymv2aYlrbeeuuiuHXXXbcobujQoUVxxx13XFHcEUcc0dSct/TSSxfFvfbaa02tMy2++OJFce3t7UVxTz75ZFHcscceG6X+8Y9/FMX985//jFZiRDoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANQYUndnK1t88cWL4vbff/+mP/fTTz9dFHfwwQdHK1l22WWL4o477rimPu+oUaOK4n7xi18Uxb3zzjtTuEYwdZxyyilFcSussEJR3BNPPFEUd+SRRxbFPfTQQ9EbFlpooaK4Cy64oKn/vrS3txfFjRgxoihus802K4p78MEHi+LoH3bZZZeiuB/+8IdFcb/73e+mcI0YKEpzVGkc9EUbbLBBcWzpv8elx49XXXVVNNM555wTA8G6665bFLfnnns29XkHDSobg7jXXns19XlhWvvoRz9aFDfbbLMVxR1xxBFFcccff3xR3IEHHlgUt9tuuxXFzTvvvNEb/vKXvxTFnXnmmUVxl19+eVHca6+9VhTHezMiHQAAAAAAaiikAwAAAABADYV0AAAAAACooZAOAAAAAAA1FNIBAAAAAKCGQjoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAagyJFjPnnHMWxV144YVFcfPMM0/xc48dO7Yo7le/+lVR3OOPPx4DwfDhw4vijj766KK4hRZaKJrpjDPOKIo788wzm/q8UGfQoLLzoHvvvXfxhtxkk02K4kaNGlUUd+SRRxbF/fKXv4zesOuuuxbFHXrooUVxM888c/SG0n8Lzj///Km+LvQ9L7zwQlHcHnvsMdXXhf6hNDe2tbU19TMI/d3IkSOL4vbaa6+pvi79Uekx3FFHHVUU197eXhR36623FsV95CMfKYp75plniuKgr5p//vmbuh+w/fbbF8V9+9vfjmZ66aWXiuJOP/30orjDDz+8KO6mm24qiqP/MiIdAAAAAABqKKQDAAAAAEANhXQAAAAAAKihkA4AAAAAADUU0gEAAAAAoIZCOgAAAAAA1FBIBwAAAACAGgrpAAAAAABQQyEdAAAAAABqDIkBYo455iiK+8c//lEUt+SSS0azXXzxxUVxf/jDH6KVfPzjHy+KW2+99Zr6vI888khR3E9/+tOmPi80w5xzzlkU9+Mf/7jpG/y73/1uUdwxxxwTveHzn/98Udyxxx5bFNfe3h592Te/+c2iuEcffXSqrwvQdy277LJNjSvNjT/5yU+K4oCBaf755y+KO+OMM4ri1lxzzaK45557rihum222KYr773//WxQH/d1NN91UFLfpppsWxS222GJFcW+//XZTj31OPfXUoriXX365KA4ajEgHAAAAAIAaCukAAAAAAFBDIR0AAAAAAGoopAMAAAAAQA2FdAAAAAAAqKGQDgAAAAAANRTSAQAAAACghkI6AAAAAADUUEgHAAAAAIAaQ2KAuPTSS4viVl111egto0aNKorbZ599oje89tprRXEXX3xxUdyss85aFHfUUUcVxQ0fPjya6fzzzy+Ku//++5v6vNDf7b///kVxm222WVHcAgssUBQ3wwwzFMUtscQSMRB8//vfL4o7++yzp/q6AP3fN77xjabub918881Fcb/4xS+K4oCB6ROf+ERR3JprrtnU5x09enRR3H//+9+mPi9MS0OHDi2OLT3mWmSRRaI3vPXWW0Vx1157bVHcyy+/PIVrBJNmRDoAAAAAANRQSAcAAAAAgBoK6QAAAAAAUEMhHQAAAAAAaiikAwAA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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x500 with 0 Axes>"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1200x500 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 60
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:44:00.521033Z",
     "start_time": "2025-11-21T07:44:00.354046Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Accuracy comparison\n",
    "plt.subplot(1, 2, 1)\n",
    "k_list = [r[0] for r in results]\n",
    "custom_acc = [r[1] for r in results]\n",
    "sklearn_acc = [r[2] for r in results]\n",
    "plt.plot(k_list, custom_acc, 'o-', label='Custom KNN')\n",
    "plt.plot(k_list, sklearn_acc, 's-', label='sklearn KNN')\n",
    "plt.title('Accuracy Comparison')\n",
    "plt.xlabel('k value')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.xticks(k_list)\n",
    "plt.legend()\n",
    "plt.grid(True)\n"
   ],
   "id": "6cb944c25f98de32",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1a69c2b4cd0>"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 61
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:44:00.745173Z",
     "start_time": "2025-11-21T07:44:00.529868Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Time comparison\n",
    "plt.subplot(1, 2, 2)\n",
    "custom_time = [r[3] for r in results]\n",
    "sklearn_time = [r[4] for r in results]\n",
    "plt.plot(k_list, custom_time, 'o-', label='Custom KNN')\n",
    "plt.plot(k_list, sklearn_time, 's-', label='sklearn KNN')\n",
    "plt.title('Running Time Comparison')\n",
    "plt.xlabel('k value')\n",
    "plt.ylabel('Time (seconds)')\n",
    "plt.xticks(k_list)\n",
    "plt.legend()\n",
    "plt.grid(True)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ],
   "id": "bb0b56109d38a9e5",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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Z5ljXIMF/XAvDlZuQnB3p+oNWe70+uSTT6h58+Zyvk2bNnTjjTfSs88+i5AFl+XqTQSgzftt0xAuPgAhMzOzxGV8HgcmAADYIWR58cTnnntOarM8WTf/ff755+VyAKhYQaGR/khMoc0HkuQvn9dSamoKTZw4ju65pxM988wQOnr0iFO9PW+8MYXee+9t0/kXXxxDo0c/K7vw/fr1pClTJpmuW7hwPo0aNUz+79SpHc2fP6/E/fCpJtjUXMBTHPJS4MuXL6d169bJdIevvfYa3XffffZ/hgAuYtuRS/T2tqOUlHFtBZG6fl407u4ourtJqCaPWRQsbrRo0f/R9u1badKkF+iLL1bKJE9VwSG2YsV6ql+/+o76XL16Be3fv0/KYjAU1Q9//HEbJSdfpuDgkDLbf/31WnryyWfIy8uLnK4my3j574ULF9I333xDn376KQIWwELAvrg+oUTAMj7Pl/P19nb6dCL98svP9NJLr1BERCMaMGAwpaWlUULC3073Xp04cZw+/PA9evnlKRQaGma6nGu069atLvc26elptHXrd1TTbArZ/Px8GcK1b98+Of/qq6/SggULZKgLgJ4OUMjKK7B4ysjJp/9sO1rpfXENl7ezdF+lZ72rzN9/76UGDRqaannu7u4UF/eojJLYuPFr0641O3furNROFd99t4ni4h6SZoaxY0eZDjgaOLCvaTu+nv/fsmWz6XY//LCFBgzoQz16dKV33plNOTk5cjlv9+67b9K9995JS5b8l55+ejD17v0AnT9/zmI5+Cis119/hXr27E0dO3Yqcd0dd3SWkOVMKo2vW716OdU0m/YZpk+fTrt376b27dvLef773//+ly5fviwTegO4Og67ocv20N6zaXa5P67Rxn7ws8Xt2jQIoAWPtlHV833p0kUKCgoqcdlTTxUF6/HjFYf+1auZNHXqZHrlldepZcsYCctlyz6n4cNH0aefLqGCgkK6//5Y2W0PD69Hvr6+crsDB/ZL88TkydOpcePr5P+PP/6AnntunFzv7e1D/fsPov/+9xP64IMF9MYbr9HevfFUr179Ssvx7bcbJKzbt+9Q5rquXe+TH5Mff/yhzHW9evWll14aW+M1d5tqsps2bZJxscoQLl6O5u2336b169fb+/kBOCxHH9DFtTuDwfoBnlzj5TGiPD44JCSUZs16h4YOHS7X1apV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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 62
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:44:00.759512Z",
     "start_time": "2025-11-21T07:44:00.753812Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# Print detailed comparison analysis\n",
    "print(\"\\nAlgorithm Comparison Analysis:\")\n",
    "print(\"1. Accuracy Comparison:\")\n",
    "avg_custom_acc = np.mean([r[1] for r in results])\n",
    "avg_sklearn_acc = np.mean([r[2] for r in results])\n",
    "print(f\"   - Custom KNN average accuracy: {avg_custom_acc*100:.2f}%\")\n",
    "print(f\"   - sklearn KNN average accuracy: {avg_sklearn_acc*100:.2f}%\")\n",
    "print(f\"   - Difference: {(avg_sklearn_acc - avg_custom_acc)*100:.2f}%\")\n",
    "\n"
   ],
   "id": "621f6a98d46cc6e3",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Algorithm Comparison Analysis:\n",
      "1. Accuracy Comparison:\n",
      "   - Custom KNN average accuracy: 19.60%\n",
      "   - sklearn KNN average accuracy: 89.20%\n",
      "   - Difference: 69.60%\n"
     ]
    }
   ],
   "execution_count": 63
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:44:00.777931Z",
     "start_time": "2025-11-21T07:44:00.772029Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(\"\\n2. Speed Comparison:\")\n",
    "avg_custom_time = np.mean([r[3] for r in results])\n",
    "avg_sklearn_time = np.mean([r[4] for r in results])\n",
    "print(f\"   - Custom KNN average time: {avg_custom_time:.6f} seconds\")\n",
    "print(f\"   - sklearn KNN average time: {avg_sklearn_time:.6f} seconds\")\n",
    "print(f\"   - sklearn is {avg_custom_time / avg_sklearn_time:.2f}x faster than custom implementation\")\n",
    "\n"
   ],
   "id": "92b762b3f4c40c1d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "2. Speed Comparison:\n",
      "   - Custom KNN average time: 0.367870 seconds\n",
      "   - sklearn KNN average time: 0.028030 seconds\n",
      "   - sklearn is 13.12x faster than custom implementation\n"
     ]
    }
   ],
   "execution_count": 64
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T07:44:00.795618Z",
     "start_time": "2025-11-21T07:44:00.789878Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(\"\\n3. Pros and Cons Analysis:\")\n",
    "print(\"   - Custom KNN:\")\n",
    "print(\"     * Pros: Simple and intuitive implementation, good for learning KNN algorithm principles\")\n",
    "print(\"     * Cons: Poor performance, especially on large datasets\")\n",
    "print(\"   - sklearn KNN:\")\n",
    "print(\"     * Pros: Highly optimized with efficient algorithm implementation and data structures\")\n",
    "print(\"     * Pros: Supports parallel computing (n_jobs parameter)\")\n",
    "print(\"     * Pros: Provides more parameter options and features\")\n",
    "print(\"     * Cons: Implementation is relatively complex, algorithm essence not directly visible\")"
   ],
   "id": "fb4965394801c9fa",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "3. Pros and Cons Analysis:\n",
      "   - Custom KNN:\n",
      "     * Pros: Simple and intuitive implementation, good for learning KNN algorithm principles\n",
      "     * Cons: Poor performance, especially on large datasets\n",
      "   - sklearn KNN:\n",
      "     * Pros: Highly optimized with efficient algorithm implementation and data structures\n",
      "     * Pros: Supports parallel computing (n_jobs parameter)\n",
      "     * Pros: Provides more parameter options and features\n",
      "     * Cons: Implementation is relatively complex, algorithm essence not directly visible\n"
     ]
    }
   ],
   "execution_count": 65
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
